home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / pbclon21.zip / PBCLONE.DOC < prev    next >
Text File  |  1993-01-12  |  50KB  |  1,084 lines

  1.                      The PBClone Library
  2.                    =---------------------=
  3.                          Version 2.1
  4.  
  5.     PBCLONE  Copyright (c) 1990-1993  Thomas G. Hanlin III
  6.  
  7.  
  8.  
  9. Use of LIBMAT or LIBWIZ is strongly recommended for creating
  10. the initial PBClone library.  You should be able to get these
  11. utilities from the same place you got this library.
  12.  
  13. This is PBClone, a library of over 550 assembly language and
  14. BASIC routines for use with Microsoft's BASIC compilers:
  15. Bascom, PDS, QuickBasic and Visual BASIC for DOS.  The PBClone
  16. collection is copyrighted and may be distributed only under the
  17. following conditions:
  18.  
  19.    All PBClone files must be distributed together as a unit.
  20.    No files may be altered, added, or deleted from this unit.
  21.  
  22. You use this library at your own risk.  It has been tested by
  23. me on my own computer, but I will not assume any responsibility
  24. for any problems which PBClone may cause you.  If you do run
  25. into a problem, please let me know about it, and I will do my
  26. best to verify and repair it.
  27.  
  28. It is expected that if you find PBClone useful, you will
  29. register your copy.  You may not use PBClone routines in
  30. programs intended for sale unless you have registered.
  31.  
  32. Registration gets you the latest version of PBClone, complete
  33. with full source code.  The assembly language code is designed
  34. for MASM 6.0 and may require alteration for other assemblers.
  35.  
  36. You will need to have a complete set of PBClone .OBJ files for
  37. LibWiz to work.  Create a fresh subdirectory and extract the
  38. BASIC sources from PBC$BAS.ZIP (or .LZH, etc).  Compile them
  39. all.  The following DOS command will do it:
  40.  
  41.    FOR %x IN (*.BAS) DO BC %x /o;
  42.  
  43. Now extract the .OBJ files from PBC$MAIN.LIB into the same
  44. directory, using the UnLib utility that comes with LibWiz.
  45. Finally, extract the .OBJ files from PBC$NEAR.LIB as well. This
  46. gives you a complete set of .OBJs for PBClone, allowing LibWiz
  47. to create a custom PBClone library for you.
  48.  
  49. The VB-DOS compiler always uses far strings.  For it, you must
  50. use the .OBJs from PBC$FAR.LIB instead of PBC$NEAR.LIB.
  51.  
  52. With PDS, you have a choice between near and far strings.  To
  53. use far strings, use the /FS switch when compiling, and use the
  54. .OBJs from PBC$FAR.LIB instead of PBC$NEAR.LIB.
  55.  
  56.                      Creating .QLB files
  57.  
  58.  
  59.  
  60. If you like to use the BASIC editor/environment, you will need
  61. to create a .QLB version of the library to complement the .LIB
  62. version.  LIBWIZ can do it for you, or you can do it manually.
  63. This is done using the LINK.EXE utility that came with your
  64. compiler.  The exact parameters differ slightly depending on
  65. which version of the compiler you have.  For QuickBasic, it
  66. looks something like this:
  67.  
  68.    LINK libname.LIB/Q/SE:1024,libname.QLB,NUL,BQLB45;
  69.  
  70. The BQLB45 file is for QuickBasic 4.5.  This should be replaced
  71. by BQLB40 or BQLB41 for QuickBasic 4.0 (check your files to see
  72. which you have).  For BASCOM 6.0-7.1, also called Professional
  73. Development System or PDS, use QBXQLB instead of BQLB45.  For
  74. VB-DOS, use VBDOSQLB instead of BQLB45.
  75.  
  76. Since you'll probably want to do this again in the future when
  77. you get a new version of BasWiz or PBClone, I'd suggest you
  78. create a batch file or alias to do the work for you.  If you
  79. have 4DOS, an alias such as the following will do it:
  80.  
  81.    ALIAS QLB LINK %%1.LIB/Q/SE:1024,%%1.QLB,NUL,BQLB45;
  82.  
  83. In this case, you can do the conversion simply by typing:
  84.  
  85.    QLB libname
  86.  
  87.                      The TSR File Viewer
  88.  
  89.  
  90.  
  91. Since there are hundreds of routines in PBClone, it isn't
  92. always exactly easy to remember which routine you want or how
  93. to use it.  This is a particular problem when you're in the
  94. middle of writing a program.  So, I've written a TSR file
  95. viewer... it's crude, but it gets the job done.
  96.  
  97. Just type "FV" to install the TSR.  Alt-V activates it.  "FV
  98. /D" removes it from memory.
  99.  
  100.      !!! ----== NOTE ==---- !!!
  101. Please check FV with a nonessential application first!  It
  102. appears to work fine in the QuickBasic environment, but it
  103. locks up my favorite editor, so I can't guarantee that it will
  104. behave properly in all circumstances.
  105.  
  106. First, FV will ask you for the file to view.  This may contain
  107. drive and subdirectory information as well as the file name.
  108. Second, you will be asked for a search string.  If you enter a
  109. search string, viewing will start at the part of the file that
  110. contains that search string.  If you just press enter, viewing
  111. will start at the beginning of the file.  The file will be
  112. presented to you one page at a time.  I suggest viewing
  113. PBCLONE.DOC or PBCLONE.INF.
  114.  
  115. FV was written in BASIC using Crescent's P.D.Q. library, with
  116. the "simplified" TSR handler (which doesn't seem to have been
  117. entirely debugged).  Then again, TSRs are a tricky matter,
  118. especially with BASIC...
  119.  
  120.                         General Notes
  121.  
  122.  
  123.  
  124. The initial version of PBClone had only one manual.  However,
  125. since there are so many routines, I've split the manual into a
  126. general documentation file and a reference manual.  You won't
  127. want to print PBCLONE.MAN unless you have a lot of time and
  128. printer paper!  In contrast, this file (PBCLONE.DOC) has been
  129. kept small to allow ready printing.  It contains general notes,
  130. cross-reference listings of the routines, and assorted charts.
  131.  
  132. Many of the routines in PBClone are similar to routines of the
  133. same name in ADVBAS and/or ProBas.  The key here is "similar"--
  134. they don't necessarily work the same way and may not produce
  135. the same results.  If you intend to convert from ADVBAS or
  136. ProBas to PBClone, read the documentation carefully.
  137.  
  138. When a PBClone returns a Boolean (on or off) value, it will
  139. always be 0 if off, -1 if on; this is unlike ProBas, which
  140. would often return any non-zero value for an "on" state.
  141. Booleans passed to PBClone may still use any non-zero value to
  142. indicate a "true" or "on" condition, however.
  143.  
  144. Critical error handling has been incorporated into all disk and
  145. device routines.  You will never have to worry about "R>etry,
  146. A>bort, I>gnore" again, so long as you use PBClone for your
  147. disk and device management.
  148.  
  149. PBClone file handling is very flexible but may be confusing to
  150. people used to BASIC's strongly-moded files.  PBClone file
  151. handling is most similar to BASIC files opened in BINARY mode.
  152. You may read or write any amount of information at a time.
  153. After each read or write takes place, the file pointer is
  154. updated appropriately, so you can use sequential access
  155. techniques without further effort.  Random access is also
  156. possible, using FSetLoc/FSetOfs/FSetRec to set the file pointer
  157. position.  Those of you who are familiar with C or Pascal file
  158. handling will notice strong similarities in this approach,
  159. which is based on techniques that have long been standard in
  160. the industry.
  161.  
  162. Many routines are available both as SUBprograms and as
  163. FUNCTIONs.  The former is for compatibility with older programs
  164. which were designed before BASIC was capable of using
  165. FUNCTIONs.  You may use either, of course, although the
  166. FUNCTION version of a routine is often more convenient.
  167.  
  168.                         General Notes
  169.  
  170.  
  171.  
  172. The PBClone library can be used in conjunction with other
  173. libraries.  If there is a conflict in routine names between the
  174. two libraries, the OBJTOOL utility can be used to rename one or
  175. the other routine.  Due to the large size of PBClone, you will
  176. probably need to select just the routines you need, rather than
  177. combining the entire libraries, in order to avoid overflowing
  178. LINK limitations.  OBJTOOL can help you find out which routines
  179. are in what modules.  The LIB utility can be used to alter
  180. existing libraries, or you can build your own custom libraries
  181. from the ground up, using LibWiz.  See the LIB_BI.DOC and
  182. LIBRARY.TXT files if you are not familiar with libraries.
  183.  
  184. LibMatic, LibWiz and ObjTool are included on the sampler disk
  185. that comes with the registered version of PBClone.  They should
  186. also be available at your local BBS.
  187.  
  188. If you have not used ADVBAS, ProBas, or PBClone before, you may
  189. be unfamiliar with the array handling conventions used here.
  190. In almost all array routines, you will see a pair of parameters
  191. (e.g. DSeg% and DOfs%) used to represent an array.  These
  192. values are obtained by the BASIC functions VARSEG and VARPTR:
  193.  
  194.    DSeg% = VARSEG(Array(1))    ' or whatever the first...
  195.    DOfs% = VARPTR(Array(1))    ' ...desired element may be
  196.  
  197. This is the way that current versions of QuickBasic and BASCOM
  198. pass arrays, TYPEd values, and fixed-length STRING values to
  199. assembly-language routines.  It tells the routine where in
  200. memory to find the value(s).  Since these values may move
  201. around in memory, it is important to get the VARSEG and VARPTR
  202. just before you call the routine.  Any routine that accepts a
  203. segment and an offset can be used with arrays, TYPEd values,
  204. and fixed-length strings interchangeably.  This allows for
  205. considerable flexibility.
  206.  
  207. Virtually all of the variables used in PBClone are integers.
  208. In this manual, integers are indicated specifically by use of
  209. the "%" integer postfix.  The use of DEFINT A-Z in your program
  210. will cause your variables to be integers by default, which I
  211. would recommend unless you use floating point heavily.
  212.  
  213.                         General Notes
  214.  
  215.  
  216.  
  217. Most of the routines in ProBas (and all of the routines in
  218. ADVBAS) did not require a DECLARE if the CALL syntax was used.
  219. This is not true of PBClone, which requires DECLAREs.  There
  220. are numerous advantages to this:
  221.  
  222.    1) BASIC can more easily detect syntax errors.
  223.    2) You may use CALL or the new simplified syntax.
  224.    3) Many of the routines are smaller and faster due to
  225.       use of the DECLARE option BYVAL.
  226.  
  227. The DECLAREs are generated in a .BI file by LIBWIZ.  Assuming
  228. you named the library PBC, you can include the DECLAREs in your
  229. program with this statement:
  230.  
  231.    REM $INCLUDE: 'PBC.BI'
  232.  
  233. The PBC.BI file must be in the same directory as your program,
  234. or you can put it into a specific directory by setting an
  235. environment variable.  I keep my include files in a directory
  236. called C:\INCLUDE, so I have the following line in my
  237. AUTOEXEC.BAT:
  238.  
  239.    SET INCLUDE=C:\INCLUDE
  240.  
  241. As mentioned, there are now two ways of calling any
  242. subprogram.  You can use the CALL keyword or an implicit call.
  243. In the case of the CopyFile routine, for instance, you could
  244. use either of these calls interchangeably:
  245.  
  246.    CALL CopyFile (FromFile$, ToFile$, ErrCode%)
  247.  
  248.    CopyFile FromFile$, ToFile$, ErrCode%
  249.  
  250. The latter technique is more elegant, to my tastes, and is the
  251. one used throughout the PBClone documentation and examples.
  252. You may use whichever method you prefer-- BASIC generates the
  253. same code either way.
  254.  
  255. How you capitalize the names of the variables and routines is
  256. up to you.  I like mixed uppercase and lowercase, but it really
  257. doesn't matter.  You can also change the names of the variables
  258. or even replace them with constants, as long as you maintain
  259. the correct type:
  260.  
  261.    COPYfile "C:\AUTOEXEC.BAT", "A:AUTOEXEC.BAT", errornumber%
  262.  
  263.                         General Notes
  264.  
  265.  
  266.  
  267. If you have registered PBClone and wish to reassemble all of the
  268. routines written in assembly language, first place these
  269. routines in their own subdirectory.  Then:
  270.  
  271.    FOR %x IN (*.ASM) DO MASM %x ;
  272.  
  273. Note that you will need to use "%%x" instead of "%x" if you
  274. place this statement in a batch file.
  275.  
  276. The .OBJ files created by this process will be compatible with
  277. QuickBasic strings and PDS near strings.  If you have PDS and
  278. would like to create a far string version of PBClone, you must
  279. set the FarString label when assembling.  Far strings are also
  280. required for the VB-DOS compiler.
  281.  
  282.    FOR %x IN (*.ASM) DO MASM %x /DFarString ;
  283.  
  284. You can most readily create a library from the resulting .OBJ
  285. files by using the LibMatic or LibWiz utilities.  Due to the
  286. size of PBClone, manual library creation is not recommended.
  287.  
  288. If you find any bugs or problems with PBClone, or have any
  289. suggestions to make, please let me know.  You can reach me
  290. through any of the BBSes listed in WHERE.BBS, or write to me by
  291. conventional mail.  Please DO NOT call me directly!  I loathe a
  292. ringing phone.  Phones were meant for modem use only!
  293.  
  294.                       Routine Reference
  295.  
  296.  
  297.  
  298. Array Management:
  299.    AddMatI       add to each element of an integer array
  300.    AddMatL       add to each element of a long integer array
  301.    BinSeekD      search a sorted array of double-precision nos.
  302.    BinSeekI      search a sorted array of integers
  303.    BinSeekL      search a sorted array of long integers
  304.    BinSeekS      search a sorted array of single-precision nos.
  305.    BinSeekSt     search a sorted array of strings
  306.    DRecDel       delete a record or element from an array
  307.    DRecIns       insert a record or element into an array
  308.    InitPtr       initialize an array of pointers
  309.    MeanAverageD  calculate the average of a double-prec. array
  310.    MeanAverageI  calculate the average of an integer array
  311.    MeanAverageL  calculate the average of a long integer array
  312.    MeanAverageS  calculate the average of a single-prec. array
  313.    MulMatI       multiply each element of an integer array
  314.    PSortD        pointer-sort a double-prec. array
  315.    PSortI        pointer-sort an integer array
  316.    PSortL        pointer-sort a long integer array
  317.    PSortS        pointer-sort a single-prec. array
  318.    PSortSt       pointer-sort a string array
  319.    ReverseD      reverse the elements in a double-prec. array
  320.    ReverseI      reverse the elements in an integer array
  321.    ReverseL      reverse the elements in a long integer array
  322.    ReverseS      reverse the elements in a single-prec. array
  323.    ReverseSt     reverse the elements in a string array
  324.    SetMatI       set each element of an integer array
  325.    SetMatL       set each element of a long integer array
  326.    SortD         sort an array of double-precision numbers
  327.    SortI         sort an array of integers
  328.    SortL         sort an array of long integers
  329.    SortS         sort an array of single-precision numbers
  330.    SortSt        sort an array of strings
  331.  
  332.                       Routine Reference
  333.  
  334.  
  335.  
  336. Disk:
  337.    BootDrive$    determine the drive used to boot the computer
  338.    CDROM         see if a CD-ROM is installed and get info
  339.    CheckDisk     see if a disk is ready to be accessed
  340.    CheckDsk%     see if a disk is ready to be accessed
  341.    CheckShare    determine whether SHARE is installed
  342.    CheckShare2%  determine whether SHARE is installed
  343.    DelSub        delete a subdirectory
  344.    DiskStat      get information on disk memory
  345.    DReadAbs      read absolute disk sector (drive <32M)
  346.    DReadAbsBig   read absolute disk sector (any size drive)
  347.    DriveSpace&   see how much space is free on a disk
  348.    DrvType       see if a drive is removeable and/or networked
  349.    DWriteAbs     write absolute disk sector (drive <32M)
  350.    DWriteAbsBig  write absolute disk sector (any size drive)
  351.    FDescRead$    read a 4DOS-style file description
  352.    FindFirstF    find the first file to match specs
  353.    FindFirstFx   find the first file to match specs
  354.    FindNextF     find any other files which match specs
  355.    FindNextFx    find any other files which match specs
  356.    Floppies      see how many floppy drives are attached
  357.    Floppies2%    see how many floppy drives are attached
  358.    FloppyType    see what types of floppy drives are installed
  359.    FReadLn       read a line of text from a file (LINE INPUT#)
  360.    GetAttrF      get attribute of a file matched by FindFirstF
  361.    GetAttrFx%    get attribute of a file matched by FindFirstFx
  362.    GetDateF      get date of a file matched by FindFirstF
  363.    GetDateFx$    get date of a file matched by FindFirstFx
  364.    GetDrive$     get the default drive
  365.    GetExecPath   get drive, subdir, name of current program
  366.    GetLabel      get a disk volume label
  367.    GetNameF      get the name of a file matched by FindFirstF
  368.    GetNameFx$    get the name of a file matched by FindFirstFx
  369.    GetSerial     get a disk serial number
  370.    GetSizeFL     get the size of a file matched by FindFirstF
  371.    GetSizeFx&    get the size of a file matched by FindFirstFx
  372.    GetSub        get the default subdirectory
  373.    GetSub1       get the default subdirectory on a given drive
  374.    GetTimeF      get the time of a file matched by FindFirstF
  375.    GetTimeFx$    get the time of a file matched by FindFirstFx
  376.    GetVerify     determine status of the DOS "verify" setting
  377.    LoadDir       load names of matching files into an array
  378.    LoadDirAll    load all info about matching files into array
  379.    LogicalDrives% see how many logical drives are available
  380.    MakeSub       create a subdirectory
  381.    RenSub        rename a subdirectory
  382.    Retries       set the retries used for file networking
  383.    SetDrv        set the default drive
  384.    SetLabel      set a disk volume label
  385.    SetLogiDrive  set logical drive (useful for 1-floppy setups)
  386.    SetSub        set the default subdirectory
  387.    SetVerify     set the state of the DOS "verify" switch
  388.    SubExist      determine whether a subdirectory exists
  389.    SubExist2%    determine whether a subdirectory exists
  390.  
  391.                       Routine Reference
  392.  
  393.  
  394.  
  395. Display:
  396.    BigPrint      display text in huge letters
  397.    BkSpace       backspace destructively with wrap
  398.    BkScroll      scroll an area of the screen down
  399.    Blink         switch blinking vs. intense background colors
  400.    CalcAttr      calc color/attribute from fore & background
  401.    CalcAttr2%    calc color/attribute from fore & background
  402.    CalcSize      calc array size needed to save a screen area
  403.    CalcVGAColor  calculate a VGA palette color setting
  404.    ClearArea     clear an area of the screen w/ special effects
  405.    Clock         display a clock on the screen constantly
  406.    ClockSet      set various parameters for the clock
  407.    ClrCols       clear between specified columns on a row
  408.    ClrEOL        clear to the end of the row
  409.    ClrEOP        clear to the end of the screen
  410.    ClrSOL        clear to the start of the row
  411.    ClrSOP        clear to the start of the screen
  412.    CPrintScreen1 send a SCREEN 1 display to the printer
  413.    CPrintScreen2 send a SCREEN 2 display to the printer
  414.    CursorInfo    return cursor visibility, current & max sizes
  415.    CWindowManC   display pop-up window in CGA graphics mode
  416.    DClear        clear a display being kept in an array
  417.    DClearSS      clear a display of unusual size in an array
  418.    DelChr        delete a character from the screen
  419.    DelLine       delete a row from the screen
  420.    DGClear       clear a CGA virtual screen
  421.    DGetScreen    get an area of the screen into an array
  422.    DGQPrint      write to a CGA virtual screen (SCREEN 1 type)
  423.    DGXQPrint     write to a CGA virtual screen (SCREEN 2 type)
  424.    DGXQPrint1    write to a CGA virtual screen (SCREEN 2 type)
  425.    Dissolve      clear the screen with special effects
  426.    DMPrint       display text directly through DOS services
  427.    DOSClrEol     clear from the cursor to end of line via DOS
  428.    DOSCls        clears the screen using DOS output
  429.    DOSColor      sets the screen color using DOS output
  430.    DOSLocate     sets the cursor position using DOS output
  431.    DPutScreen    put an array onto an area of the screen
  432.    DRecolor      recolor text of a specified color in an array
  433.    DRecolorArea  recolor a block of text in an array
  434.    DScrRest      restore a saved screen from an array
  435.    DScrSave      save a screen to an array or other memory
  436.    DWindowMan    make a pop-up window in an array
  437.    DWindowMan2   pop-up window in an array (definable frames)
  438.    DWindowMan3   pop-up window in an array (array-based parms)
  439.    DWindowMan4   pop-up window in an array (Spartan version)
  440.    DXQPrint      write text into an array
  441.    EGARest7      restore a saved screen to EGA SCREEN 7 display
  442.    EGARest8      restore a saved screen to EGA SCREEN 8 display
  443.    EGARest9      restore a saved screen to EGA SCREEN 9 display
  444.    EGASave7      save an EGA SCREEN 7 display to an array
  445.    EGASave8      save an EGA SCREEN 8 display to an array
  446.    EGASave9      save an EGA SCREEN 9 display to an array
  447.  
  448.                       Routine Reference
  449.  
  450.  
  451.  
  452. Display:
  453.    EWindowManC   display pop-up window on EGA/VGA graphics
  454.    EXQPrintC     display text at high speed on EGA/VGA graphics
  455.    FadeOut       clear the screen with special effects
  456.    GetColor      get the current colors being used by BASIC
  457.    GetCRT%       determine whether the display is color or mono
  458.    GetEGA        see if an EGA is in use and get info about it
  459.    GetEGA2%      see if an EGA is in use
  460.    GetHGA%       see if a Hercules mono adapter is in use
  461.    GetLine       get a row of text from virtual or saved screen
  462.    GetRows%      see how many rows are on the screen
  463.    GetScreen     get an area of the screen into an array
  464.    GetVGA        see if a VGA is in use
  465.    GetVGA2%      see if a VGA is in use
  466.    GetVGAColor   get the specified VGA palette setting
  467.    GetVGAPalette get the specified VGA palette settings
  468.    GetVidMode    get display mode and other screen info
  469.    GQPrint       display text quickly in CGA SCREEN 2 mode
  470.    GrafPrint     display sized text at graphics coordinates
  471.    GrafRest      restore a saved CGA graphics screen
  472.    GrafSave      save a CGA graphics screen to an array
  473.    GXQPrint      display text quickly in CGA SCREEN 1
  474.    GXQPrint1     display text quickly in CGA SCREEN 1
  475.    HCls          clear screen in Hercules graphics mode
  476.    HiLite        highlight text on the screen
  477.    HLine         draw a line in Hercules graphics mode
  478.    HMode         switch between text and Herc graphics modes
  479.    HPrint        display text in Hercules graphics mode
  480.    HSetPixel     plot a point in Hercules graphics mode
  481.    HTestPixel    get the color of a point in Herc graphics mode
  482.    InsChr        insert a space onto the screen
  483.    InsLine       insert a blank row onto the screen
  484.    LScroll       scroll an area of the screen left
  485.    MPrint        display text through DOS, obeying MWindow
  486.    MWindow       sets a display region for MPrint
  487.    PrintBox      display a box of characters or strings
  488.    PrintScreen   print the screen on a printer
  489.    PutScreen     put an array onto an area of the screen
  490.    QPrint        display text very quickly
  491.    ReadScreen    read a string from the screen
  492.    ReColor       change text of a selected color to a new color
  493.    ReColorArea   change text in a selected area to a new color
  494.    RScroll       scroll an area of the screen right
  495.    Scroll        scroll an area of the screen up
  496.    ScrRest       restore a saved screen from an array
  497.    ScrSave       save a screen to an array
  498.    SCrunch       compress an 80x25 text screen in an array
  499.    SCrunchSS     compress any size of text screen in an array
  500.    SetCGAColor   set various aspects of CGA colors
  501.    SetVGAColor   set the specified VGA palette info (1 color)
  502.    SetVGAPalette set the specified VGA palette info (1+ colors)
  503.  
  504.                       Routine Reference
  505.  
  506.  
  507.  
  508. Display:
  509.    ShowIcon      display a Windows icon file (.ICO)
  510.    Split         clear the screen by scrolling different ways
  511.    TypePrint     display text as if it is being typed
  512.    UnCalcAttr    convert color/attribute to fore & background
  513.    UnSCrunch     uncompress a "scrunched" screen (80x25 only)
  514.    UnSCrunchSS   uncompress a "scrunched" screen (any size)
  515.    UnSplit       restore saved screen by scroll. different ways
  516.    VGARest13     restore a saved screen in VGA SCREEN 13 mode
  517.    VGASave13     save a VGA SCREEN 13 display to an array
  518.    WindowMan     display a pop-up window
  519.    WindowMan2    display a pop-up window (user-defined frames)
  520.    WindowMan3    display a pop-up window (array-based parms)
  521.    WindowMan4    display a pop-up window (spartan version)
  522.    XMPrint       display text through DOS after translation
  523.    XQPrint       display text very quickly
  524.    XQPrintOver   quick text display, overlaying existing text
  525.  
  526. Equipment:
  527.    AllExtMem&    see how much extended memory was found at boot
  528.    BootDrive     determine the drive used to boot the computer
  529.    BootDrive2$   determine the drive used to boot the computer
  530.    CDROM         see if a CD-ROM is installed and get info
  531.    CPUSpeed%     get the CPU speed in MHz
  532.    Equipment     find out about basic equipment (ports, memory)
  533.    ExtMem        see how much extended memory is available
  534.    Floppies      see how many floppy drives are available
  535.    Floppies2%    see how many floppy drives are available
  536.    FloppyType    see what types of floppy drives are installed
  537.    Get4DOSv      get installed version of 4DOS, if any
  538.    GetCRT%       determine whether the display is color or mono
  539.    GetDOSv       get the DOS version
  540.    GetEGA        see if an EGA is in use and get info about it
  541.    GetEGA2%      see if an EGA is in use
  542.    GetExtM       see how much extended memory is available
  543.    GetHGA%       see if a Hercules mono adapter is in use
  544.    GetLIMm       see how much expanded memory is available
  545.    GetLIMv       get the EMS driver version
  546.    GetMouseVer   get mouse driver version and hardware info
  547.    GetVGA        see if a VGA is in use
  548.    GetVGA2%      see if a VGA is in use
  549.    GetXMSm       see how much XMS memory is available
  550.    GetXMSv       get the XMS driver version
  551.    KbdType       see if the keyboard is enhanced (101-key)
  552.    KbdType2%     see if the keyboard is enhanced (101-key)
  553.    LogicalDrives% see how many logical drives are available
  554.    MMCheck       see if a mouse is available and # of buttons
  555.    MMCheck2%     see if a mouse is available and # of buttons
  556.    NumProc       see what kind of numeric coprocessor is in use
  557.    NumProc2%     see what kind of numeric coprocessor is in use
  558.    PCDat$        get the date of the ROM BIOS
  559.    PCDate        get the date of the ROM BIOS
  560.    PCType        get the machine I.D. from the ROM BIOS
  561.    PCType2%      get the machine I.D. from the ROM BIOS
  562.    Processor     see what kind of CPU is in use
  563.    Processor2%   see what kind of CPU is in use
  564.    WinCheck      see what version of Windows is running, if any
  565.  
  566.                       Routine Reference
  567.  
  568.  
  569.  
  570. File:
  571.    BRead         read a byte from a file into an integer
  572.    BWrite        write a byte to a file from an integer
  573.    CloseA        close an archive opened by FindFirstA
  574.    CopyFile      copy a single file
  575.    DelFile       delete a file
  576.    DFRead        read from a file into an array or other mem.
  577.    DFWrite       write to a file from an array or other memory
  578.    Exist         see if a file exists
  579.    Exist2%       see if a file exists
  580.    ExplainFAttr$ return a text explanation of a file attribute
  581.    ExtendFSpec   check, complete, and format a filespec
  582.    FClose1       close a file
  583.    FCreate       create a file and open it for access
  584.    FGetLoc       get the position of a file pointer
  585.    FGetLoc2&     get the position of a file pointer
  586.    FileCopy      copy one or more files
  587.    FileCount     count the number of matching files
  588.    FileCRC       calculate a 32-bit CRC for a file
  589.    FindFirstA    find the first file in an archive
  590.    FindNextA     find any other files in an archive
  591.    FindPatch     find where to patch an .EXE
  592.    FLock         lock any part of a file
  593.    FlushToDisk   flush a file to disk (force it to be updated)
  594.    FOpen1        open a file
  595.    ForceMatch$   force a filename to match a wildcard pattern
  596.    FSetEnd       move to the end of a file
  597.    FSetLoc       move to a specific location in a file
  598.    FSetOfs       move backwards or forwards within a file
  599.    FSetRec       move to a specific record location in a file
  600.    FSetSize      set the size of a file
  601.    FSize         get the size of a file
  602.    FSize2&       get the size of a file
  603.    FUnlock       unlock any part of a file (use w/ FLock)
  604.    GetCRCA       get CRC-16 of a file matched by FindFirstA
  605.    GetCRCAL      get CRC-32 of a file matched by FindFirstA
  606.    GetDateA      get date of a file matched by FindFirstA
  607.    GetFAttr      get attribute of a file
  608.    GetFDate      get the date of a file
  609.    GetFSize&     get the size of a file
  610.    GetFTime      get the time of a file
  611.    GetNameA      get the name of a file matched by FindFirstA
  612.    GetSizeAL     get the size of a file matched by FindFirstA
  613.    GetStoreA     get storage type of file matched by FindFirstA
  614.    GetTimeA      get the time of a file matched by FindFirstA
  615.    GLoad         load a binary image from a file (like BLOAD)
  616.    IdentifyFile  try to identify a file
  617.    IRead         read an integer from a file
  618.    IWrite        write an integer to a file
  619.    LIRead        read an integer from a file into a long int
  620.    LIWrite       write an integer to a file from a long integer
  621.    LRead         read a long integer from a file
  622.    LWrite        write a long integer to a file
  623.  
  624.                       Routine Reference
  625.  
  626.  
  627.  
  628. File:
  629.    MatchFile     see if a filename matches a wildcard filespec
  630.    ObjScan       scan an .OBJ file, return publics & externals
  631.    ParseFSpec    split filespec into drive, subdir, filename
  632.    PatchDone     terminates patching of an .EXE file
  633.    Rename        rename a file
  634.    SetFAttr      set the attribute of a file
  635.    SetFTD        set the time and date of a file
  636.    SetPatch      installs a patch into an .EXE file
  637.    SFRead        read from a file into a string
  638.    SFWrite       write from a string into a file
  639.  
  640.  
  641.  
  642. Input:
  643.    AltKey        returns letter from ASCII & scan codes of key
  644.    BarMenu       bar menu (single row) for keyboard only
  645.    BarMenuM      bar menu (single row) for keyboard or mouse
  646.    BIOSInkey     get a key from BIOS if any is waiting
  647.    BoxMenu       box menu (single column) for picking one item
  648.    BoxMenu1      box menu (single column) for picking items
  649.    BreakCheck    see if Break has been pressed
  650.    BreakOff      make sure Break doesn't interrupt the program
  651.    BreakOffDone  remove Break handler
  652.    CheckKey      get a key if any is waiting, or a mouse button
  653.    CheckKey3     get a key if any is waiting, or a mouse button
  654.    ClrKbd        clear the keyboard buffer
  655.    CtrlKey       returns letter, given ASCII code of Ctrl key
  656.    DInput        formatted dollar input routine
  657.    DOSInkey      get a key from DOS if any is waiting
  658.    DOSInky$      get a key from DOS if any is waiting
  659.    EnhKbd        enable/disable enhanced keyboard handling
  660.    FileMenu      menu for picking a file
  661.    GetKbd        get state of keyboard toggles (CapsLock, etc)
  662.    GetKbd1       get state of shift keys (Control, Alt, etc)
  663.    GetKbd2       get state of shift keys (Left/Right Alt, etc)
  664.    GetKey        get a key or mouse click (wait; 2-button)
  665.    GetKey3       get a key or mouse click (wait; 3-button)
  666.    GetPrtSc%     get whether Print Screen was pressed
  667.    GetValidKey   get one of a list of valid keys
  668.    KbdType       see if the keyboard is enhanced (101-key)
  669.    KbdType2%     see if the keyboard is enhanced (101-key)
  670.    KeyPress      see if a key is waiting to be retrieved
  671.    PrtSc         disable the PrtSc/PrintScreen key
  672.    ScanKey       get a key, if any, w/o taking it from buffer
  673.    SetKbd        set state of keyboard toggles (CapsLock, etc)
  674.    SetMouseLoc   set the mouse cursor position (text mode)
  675.    SInput        flexible replacement for LINE INPUT
  676.    SInputSet     set SInput parms (fill, exitmode, beeps, fast)
  677.    SInputSet1    set SInput parms (cursor position, full exit)
  678.    SInputSet2    set SInput parms (capitalize, tab exit)
  679.    SpeedKey      change the keyboard repeat rate
  680.    TypeIn        stuff keys into buffer as if they were typed
  681.  
  682.                       Routine Reference
  683.  
  684.  
  685.  
  686. Memory:
  687.    BlockMove     copy data from one area of memory to another
  688.    DataSeg       determine the default data segment (dgroup)
  689.    DataSeg2%     determine the default data segment (dgroup)
  690.    EMSBuffer     get the bytes needed to save EMS array state
  691.    EMSClose      close an EMS array
  692.    EMSGet        get an element from an EMS array
  693.    EMSOpen       create an EMS array
  694.    EMSPut        put an element into an EMS array
  695.    EMSRest       restore the EMS array state
  696.    EMSSave       save the EMS array state
  697.    ExtGet        get data from extended memory
  698.    ExtMem        see how much extended memory is available
  699.    ExtPut        put data into extended memory
  700.    FarPeek%      get byte from memory (like PEEK w/o DEF SEG)
  701.    FarPeekI%     get word from memory (like two PEEKs)
  702.    FarPeekL&     get dword from memory (like four PEEKs)
  703.    FarPoke       put byte into memory (like POKE w/o DEF SEG)
  704.    FarPokeI      put word into memory (like two POKEs)
  705.    FarPokeL      put dword into memory (like four POKEs)
  706.    GetExtM       see how much extended memory is available
  707.    GetLIMHandles get the number of EMS handles being used
  708.    GetLIMm       see how much expanded memory is available
  709.    GetLIMv       get the EMS driver version
  710.    GetMemBox     get location and size of MEMBOX TSR memory
  711.    GetPSP%       get the segment of the Program Segment Prefix
  712.    GetXMSm       see how much XMS memory is available
  713.    GetXMSv       get the EMS driver version
  714.    LClose        close a block of expanded memory
  715.    LGet          get a block of data from expanded memory
  716.    LOpen         open a block of expanded memory
  717.    LPut          put a block of data into expanded memory
  718.    MemSwap       swap contents of one area of memory w/ another
  719.  
  720. Miscellaneous:
  721.    Command2$     get the original DOS command line
  722.    DOSErrM$      convert a DOS error code into a text message
  723.    DOSInt%       execute a DOS function (like CALL INTERRUPT)
  724.    DupeVar       copy a TYPEd variable into a different TYPE
  725.    CatchError    set up to grab exit code from SHELLed program
  726.    GetError      get the exit code from a SHELLed program
  727.    GetError2%    get the exit code from a SHELLed program
  728.    GetSwitch$    get the DOS switch character
  729.    HandleInfo    see if a handle refers to a file or a device
  730.    IntVector     get the address of an interrupt handler
  731.    Reboot        boot the computer (like Control-Alt-Del)
  732.    RedirectIn    see whether input has been redirected
  733.    RedirectOut   see whether output has been redirected
  734.    SetError      set exit code to return when program ends
  735.    TVIdle        return clock ticks to TopView, DESQview, et al
  736.  
  737.                       Routine Reference
  738.  
  739.  
  740.  
  741. Mouse:
  742.    CheckKey      get a key if any is waiting, or a mouse button
  743.    CheckKey3     get a key if any is waiting, or a mouse button
  744.    GetKey        get key or mouse click (wait for it; 2-button)
  745.    GetKey3       get key or mouse click (wait for it; 3-button)
  746.    GetMouseLoc   get the mouse cursor position (text mode)
  747.    GetMouseVer   get mouse driver version and hardware info
  748.    MMButton      see which mouse buttons are pressed (2-button)
  749.    MMButton3     see which mouse buttons are pressed (3-button)
  750.    MMCheck       see if a mouse is installed & no. of buttons
  751.    MMCheck2%     see if a mouse is installed & no. of buttons
  752.    MMClick       see which buttons have been pressed (2-button)
  753.    MMClick3      see which buttons have been pressed (3-button)
  754.    MMCursorOff   make the mouse cursor invisible
  755.    MMCursorOn    make the mouse cursor visible
  756.    MMGetLoc      get the mouse cursor position
  757.    MMSetLoc      set the mouse cursor position
  758.    MMSetRange    set the allowable range of the mouse cursor
  759.    MouseBuffer   get no. of bytes needed to save mouse state
  760.    MouseCursor   set the mouse graphics cursor type
  761.    MousePen      turn light pen emulation by the mouse on/off
  762.    MouseRest     restore a saved mouse state
  763.    MouseSave     save the current state of the mouse
  764.    SetMouseLoc   set the mouse cursor position (text mode)
  765.  
  766.                       Routine Reference
  767.  
  768.  
  769.  
  770. Numeric:
  771.    Any2Dec       convert a number from any base into an integer
  772.    CeilD#        return the smallest integer >= number
  773.    CeilS!        return the smallest integer >= number
  774.    Dec2Any       convert an integer to any base
  775.    FloorD#       return the largest integer <= number
  776.    FloorS#       return the largest integer <= number
  777.    HiByte%       return the high byte of an integer
  778.    HiWord%       return the high word of a long integer
  779.    IVal%         convert a string to an integer
  780.    KVal%         convert a string to a long integer / 1024
  781.    LoByte%       return the low byte of an integer
  782.    LoWord%       return the low word of a long integer
  783.    LVal%         convert a string to a long integer
  784.    Max%          return the greater of two integers
  785.    MaxD#         return the greater of two double-prec. numbers
  786.    MaxL&         return the greater of two long integers
  787.    MaxS!         return the greater of two single-prec. numbers
  788.    Min%          return the smaller of two integers
  789.    MinD#         return the smaller of two double-prec. numbers
  790.    MinL&         return the smaller of two long integers
  791.    MinS!         return the smaller of two single-prec. numbers
  792.    Num2Phone$    convert a compressed phone number to a string
  793.    NumFormat     format a number as a string, like PRINT USING
  794.    Odd%          return whether an integer is odd
  795.    OddL%         return whether a long integer is odd
  796.    Phone2Num&    compress a phone number into a long integer
  797.    Rand%         return pseudo-random number in specified range
  798.    ReadBitF      read value of given bit length from an array
  799.    RotateL       rotate the bits in an integer left
  800.    RotateLL      rotate the bits in a long integer left
  801.    RotateR       rotate the bits in an integer right
  802.    RotateRL      rotate the bits in a long integer right
  803.    SetBit        set a specified bit in an integer
  804.    ShiftL        shift the bits in an integer left
  805.    ShiftLL       shift the bits in a long integer left
  806.    ShiftR        shift the bits in an integer right
  807.    ShiftRL       shift the bits in a long integer right
  808.    WriteBitF     write value of given bit length into an array
  809.  
  810. Printer:
  811.    CPrintScreen1 send a SCREEN 1 display to the printer
  812.    CPrintScreen2 send a SCREEN 2 display to the printer
  813.    GetPrtAddr    get the address of a printer port
  814.    PrinterReady% see if a printer is ready
  815.    PrinterInit   initialize a printer
  816.    PrintFile     send a file to the printer
  817.    PrintScreen   print the screen on the printer
  818.    PrtSc         disable the PrtSc/PrintScreen key
  819.    PrtSwap       swap any two printer ports
  820.    SetPrtAddr    set the address of a printer port
  821.    Spooler       see if DOS print spooler (PRINT.COM) is loaded
  822.  
  823.                       Routine Reference
  824.  
  825.  
  826.  
  827. Serial:
  828.    Carrier       determine if a carrier is present
  829.    Checksum      calculate a checksum for a string
  830.    Checksum2%    calculate a checksum for a string
  831.    CRC           calculate a CRC for a string (obsolete)
  832.    CRC1          calculate a CRC for a string
  833.    DTR           set the state of the DTR line
  834.    GetCommAddr   get the address of a comm port
  835.    SetComm       set communications parameters
  836.    SetCommAddr   set the address of a comm port
  837.  
  838.  
  839.  
  840. String:
  841.    AndSt         AND the bytes in two strings together
  842.    AscI%         get the ASCII value of a character (like ASC)
  843.    AscM%         get the ASCII value of any char in a string
  844.    Bickel        compare two strings using Bickel's algorithm
  845.    BSq           compress the blanks out of a text string
  846.    BUsq          restore a string that was compressed by BSq
  847.    BUsqLen       determine expanded length of a BSq'ed string
  848.    CenterSt$     center a string
  849.    Cipher        perform simple string encryption/decryption
  850.    CipherP       like Cipher, only the results are printable
  851.    CRC           calculate a 16-bit CRC
  852.    Crunch        remove repeated values from a string
  853.    DGetRec       get a string from memory in a record format
  854.    DGetSt        get string from numeric array or other memory
  855.    DPutRec       put a string into memory in a record format
  856.    DPutSt        put string into numeric array or other memory
  857.    ExtendFSpec   check, complete, and format a filespec
  858.    Extract       extract a delimited substring from a string
  859.    ForceMatch$   force a filename to match a wildcard pattern
  860.    FromPostal$   convert a postal abbreviation to a state name
  861.    IsAlNum%      test whether a char. is alphabetic or numeric
  862.    IsAlpha%      test whether a character is alphabetic
  863.    IsASCII%      test whether a character is ASCII
  864.    IsCntrl%      test whether a character is a control code
  865.    IsDigit%      test whether a character is a digit
  866.    IsLower%      test whether a char. is lowercase alphabetic
  867.    IsPrint%      test whether a character is printable
  868.    IsPunct%      test whether a character is punctuation
  869.    IsSpace%      test whether a character is white space
  870.    IStr$         convert an integer to a string (like STR$)
  871.    IStrNB$       convert an integer to a string w/o blank
  872.    IsUpper%      test whether a char. is uppercase alphabetic
  873.    IsXDigit%     test whether a char. is a hexadecimal digit
  874.    Locase        convert a string to lowercase (U.S. only)
  875.    Locase1       convert a string to lowercase (international)
  876.    LRotate       rotate the characters in a string left once
  877.  
  878.                       Routine Reference
  879.  
  880.  
  881.  
  882. String:
  883.    MatchFile     see if filename matches a wildcard filespec
  884.    Month0        return the name of the month, given month no.
  885.    MultiAND      perform an arithmetic AND operation on string
  886.    MultiOR       perform an arithmetic OR operation on a string
  887.    MultiXOR      perform an arithmetic XOR operation on string
  888.    NameCase      capitalize a string correctly for a name
  889.    NameCase2$    capitalize a string correctly for a name
  890.    Num2Phone$    convert a compressed phone number to a string
  891.    OrSt          OR bytes in one string with those in another
  892.    Phone2Num&    compress a phone number into a long integer
  893.    Replace       replace one character with another
  894.    ReplaceSt     replace one substring with another
  895.    Reverse       reverse a string
  896.    RInstr        find last occurrence of substring w/in string
  897.    RolSt         rotate the bits in a string left
  898.    RorSt         rotate the bits in a string right
  899.    RRotate       rotate the characters in a string right once
  900.    SFRead        read a string from a file
  901.    SFWrite       write a string to a file
  902.    ShlSt         shift the bits in a string left
  903.    ShrSt         shift the bits in a string right
  904.    Soundex       determine what a string "sounds" like
  905.    SSrch         see if one string is within another
  906.    StrDel        delete a character from a string
  907.    StrIns        insert a space into a string
  908.    Strip         strip the blanks from both sides of a string
  909.    Strip2$       strip the blanks from both sides of a string
  910.    StripBlanks   strip the blanks from side(s) of a string
  911.    StripChar     strip a specified list of chars from a string
  912.    StripRange    strip a specified range of chars from a string
  913.    StripSpaces   strip the spaces from side(s) of a string
  914.    StrSqu$       compress text string using 2&3-gram compress.
  915.    StrSqu2       compress text string using 2-gram compression
  916.    StrSqu3       compress text string using 3-gram compression
  917.    StrSquLen2    determine 2-gram compressed length of string
  918.    StrSquLen3    determine 3-gram compressed length of string
  919.    StrUnsq$      uncompress a 2 & 3-gram compressed string
  920.    StrUnsqu2     uncompress a 2-gram compressed string
  921.    StrUnsqu3     uncompress a 3-gram compressed string
  922.    StrUnsquLen2  calc full length of 2-gram compressed string
  923.    StrUnsquLen3  calc full length of 3-gram compressed string
  924.    TInstr        search for a specific kind of char in a string
  925.    ToPostal$     convert state name to its postal abbreviation
  926.    Upcase        convert a string to uppercase (U.S. only)
  927.    Upcase1       convert a string to uppercase (international)
  928.    UpcaseI       convert an ASCII code to uppercase (U.S. only)
  929.    UpcaseI1      convert ASCII to uppercase (international)
  930.    Xlate         run each char of a string through translation
  931.    XorSt         XOR bytes in one string with those in another
  932.  
  933.                       Routine Reference
  934.  
  935.  
  936.  
  937. Time:
  938.    CalcDate      get date a number of days from a starting date
  939.    CheckDate     check a date to determine whether it is valid
  940.    Clock         display a clock on the screen, constantly
  941.    ClockSet      set the parameters for the clock
  942.    Date2Int      squash a date into a single integer
  943.    DateA2R       convert a date to a number you can calc with
  944.    DateN2S       convert a date from numbers into a string
  945.    DateR2A       convert a number to a date
  946.    DateS2N       convert a date from string form into numbers
  947.    DCal          draw a calendar into an array for ScrRest
  948.    DCalendar     draw a calendar & let user to select date
  949.    Delay         delay for a given number of seconds
  950.    Delay18th     delay for a given number of 18ths of seconds
  951.    DelayV        delay for a very small amount of time
  952.    Elapsed       determine the elapsed time between two times
  953.    ElapsedTime$  determine the elapsed time between two times
  954.    EuropeDate    convert a date to European format
  955.    FormatDate    convert a date to any desired format
  956.    GetDateA      get the date of a file matched by FindFirstA
  957.    GetDateAT     get the date from the AT hardware clock
  958.    GetDateF      get date of a file matched with FindFirstF
  959.    GetDateFx$    get date of a file matched with FindFirstFx
  960.    GetFDate      get the date of a file
  961.    GetFTime      get the time of a file
  962.    GetTick&      get timer tick count (1/18th seconds)
  963.    GetTime       get time from DOS, including 100th seconds
  964.    GetTimeA      get the time of a file matched by FindFirstA
  965.    GetTimeAT     get the time from the AT hardware clock
  966.    GetTimeF      get time of a file matched with FindFirstF
  967.    GetTimeFx$    get time of a file matched with FindFirstFx
  968.    Int2Date      unsquash date from single integer to numbers
  969.    Int2DateSt$   unsquash date from single integer to string
  970.    Int2Time      unsquash time from single integer to numbers
  971.    Int2TimeSt$   unsquash time from single integer to string
  972.    Month0        return name of month, given the month number
  973.    Sec2Time$     convert seconds past midnight to time string
  974.    SetDateAT     set the date of the AT hardware clock
  975.    SetTimeAT     set the time of the AT hardware clock
  976.    Time2Int      squash a time into a single integer
  977.    Time2Sec&     convert time string to seconds past midnight
  978.    TimeN2S       convert a time from numbers into a string
  979.    TimeS2N       convert a time from a string into numbers
  980.    WeekDay0      get the day of the week
  981.    WeekDay1      returns the day of the week for a given date
  982.  
  983.                       Enhanced Key Codes
  984.  
  985.  
  986.  
  987. This is a list of the new key codes available when you use
  988. EnhKbd to enable enhanced keyboard support.  Note that the
  989. codes are direct from the BIOS, and may not always match what
  990. INKEY$ returns.  QuickBasic 4.5 provides only minimal support
  991. for the enhanced keys; QBX does much better.  As long as you
  992. use PBClone for input, of course, you don't have to worry about
  993. it.
  994.  
  995. The format used is ScanCode, ASCIIcode.
  996.  
  997.  
  998. Middle keypad key (num lock off):   0,76
  999. Middle key, with Control:           0,143
  1000.  
  1001.              plain     shift     control     alt
  1002.              -----     -----     -------    -----
  1003.    F11       0,133     0,135      0,137     0,139
  1004.    F12       0,134     0,136      0,138     0,140
  1005.  
  1006. The middle cursor pad returns the same scan codes as the
  1007. cursor/numeric pad when NumLock is off, but with an ASCII code
  1008. of 224 instead of 0.  If you want the middle cursor pad and
  1009. cursor/numeric pad to return the same values, you should have
  1010. your code do this:
  1011.  
  1012.    ' ...get key code...
  1013.    IF ASCIIcode = 224 AND ScanCode <> 0 THEN ASCIIcode = 0
  1014.  
  1015. Why test both ASCII and scan codes?  Because it is possible for
  1016. the user to enter a plain 224 by holding ALT and using the
  1017. numeric keypad, which could cause confusion.
  1018.  
  1019. The arrows in the middle cursor pad will return special codes
  1020. if pressed in combination with an ALT key:
  1021.  
  1022.    up    arrow     0,152
  1023.    down  arrow     0,160
  1024.    left  arrow     0,155
  1025.    right arrow     0,157
  1026.  
  1027. Finally, the arrow keys on either cursor pad will return
  1028. special codes if pressed in combination with a CONTROL key:
  1029.  
  1030.                    middle pad     cursor/num pad
  1031.                    ----------     --------------
  1032.    up    arrow       224,141          0,141
  1033.    down  arrow       224,145          0,145
  1034.    left  arrow       224,115          0,115
  1035.    right arrow       224,116          0,116
  1036.  
  1037.                         DOS Error Codes
  1038.  
  1039.  
  1040.  
  1041. Note that the number of error codes available depends on the
  1042. version of DOS in use.  Older versions return fewer error
  1043. codes, meaning that the nature of the error may not be
  1044. specified as precisely as you might like.  This is not a
  1045. complete list of all possible codes, but it covers the most
  1046. common ones.
  1047.  
  1048. The DOSErrM$ function can be used to generate a complete error
  1049. list if needed, current at least through DOS 3.31.  If later
  1050. versions of DOS have new error codes, I'm not aware of 'em.
  1051.  
  1052.  
  1053.   -1    Unable to read or write all of the data requested
  1054.    0    No error
  1055.    1    Invalid function number
  1056.    2    File not found
  1057.    3    Path not found
  1058.    4    No handle available (too many files open)
  1059.    5    Access denied (file already in use or "read only")
  1060.    6    Invalid handle
  1061.   15    Invalid disk drive
  1062.   16    Attempt to remove current directory
  1063.   18    No more matching files
  1064.   19    Disk is write-protected
  1065.   20    Unknown unit
  1066.   21    Drive not ready
  1067.   22    Invalid command
  1068.   23    Data CRC error
  1069.   25    Seek error
  1070.   26    Disk is not in DOS format
  1071.   27    Sector not found
  1072.   28    Printer is out of paper
  1073.   29    Write fault
  1074.   30    Read fault
  1075.   31    General failure
  1076.   32    Sharing violation
  1077.   33    Lock violation
  1078.   34    Invalid disk change
  1079.   35    No FCB available
  1080.   36    No room in file sharing buffer
  1081.   80    File already exists
  1082.   82    Unable to create subdirectory
  1083.  
  1084.